#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

void travelDir(const char* pathName);



int main(int argc,char* argv[])
{
	//输出 argv[1] 目录下所有文件名   能拿到文件名 就能操作文件
	if(argc < 2)
	{
		printf("请输入目录路径!\n");
		return -1;
	}

	struct stat st = {0};
	int ret = stat(argv[1],&st);
	if(-1 == ret)
	{
		printf("获取文件%s状态失败:%m\n",argv[1]);
		return -2;
	}

	if(S_IFDIR&st.st_mode)
	{
		travelDir(argv[1]);
	}
	else
	{
		printf("只能遍历目录哟!\n");
		return -3;
	}
}


void travelDir(const char* pathName)
{
	//进入当前目录
	DIR* pDir = opendir(pathName);

	//遍历当前目录下所有文件
	struct dirent* pd;
	char fileName[256];//带路径的文件名  

	while(1)
	{
		pd = readdir(pDir);
		if(NULL == pd) break;

		//加上路径
		memset(fileName,0,256);//清空数组
		//bzero(fileName,256);
		sprintf(fileName,"%s/%s",pathName,pd->d_name);

		if(pd->d_type & DT_DIR)
		{
			//当前文件是目录
			printf("目录--：%s\n",fileName);
			//每个目录下都有.和..两个默认目录，如果遍历的话进入这两个目录会出现段错误，所以要排除这两个目录：
			if(0 != strcmp(pd->d_name,".") &&  0 != strcmp(pd->d_name,".."))
			{

				travelDir(fileName);
			}
		}
		else
		{
			printf("文件-：%s\n",fileName);
		}
	}

	//离开当前目录
	closedir(pDir);
}